/******************************************************************************
* 文件名称：sw_i2c.h
* 内容摘要：软件IIC模块头文件
* 其他说明：见README.md
* 当前版本：V1.00
* 源码仓库：https://gitee.com/thin-wind/Module
* 作    者：孔佳伟
* 个人主页：https://gitee.com/thin-wind/
* 联系方式: QQ: 445285318
* 修改日期：2022年07月29日
******************************************************************************/
#ifndef __SW_I2C_H_
#define __SW_I2C_H_

#ifdef __cplusplus
extern "C" {
#endif

typedef unsigned char       uint8;
typedef unsigned short      uint16;
typedef unsigned int        uint32;
typedef unsigned long long  uint64;

/* 等待从机应答最大延时 */
#define SW_I2C_WAIT_ACK_CNT 1000

/*****************************************************************
* 连续读取多字节数据时，相邻字节读取延时
* 如果第一个字节读取成功，后一个字节读取失败，可以尝试增加这里的延时 
*****************************************************************/
#define SW_I2C_READ_BYTE2BYTE_CNT 10

typedef enum
{
    SW_I2C_SDA_L = 0,	/* SDA引脚低电平 */
    SW_I2C_SDA_H,       /* SDA引脚高电平 */
} SW_I2C_SDA_VALUE;

typedef void (*SW_I2C_FUNC)(void);
typedef SW_I2C_SDA_VALUE (*SW_I2C_READ_SDA)(void);

typedef struct 
{
    SW_I2C_FUNC GPIO_INIT;      /* SDA、SCL引脚设置为输出上拉模式 */
    SW_I2C_FUNC SDA_OUT_H;      /* SDA引脚初始化为输出上拉高电平 */
    SW_I2C_FUNC SDA_OUT_L;      /* SDA引脚初始化为输出上拉低电平 */
    SW_I2C_FUNC SDA_IN;         /* SDA引脚设置为输入模式 */
    SW_I2C_READ_SDA READ_SDA;   /* 读取SDA引脚电平 */
    SW_I2C_FUNC SDA_H;          /* SDA引脚输出高电平 */
    SW_I2C_FUNC SDA_L;          /* SDA引脚输出低电平 */
    SW_I2C_FUNC SCL_H;          /* SCL引脚输出高电平 */
    SW_I2C_FUNC SCL_L;          /* SCL引脚输出低电平 */
    SW_I2C_FUNC DELAY_5US;      /* 5us延时 */
    SW_I2C_FUNC DELAY_2US;      /* 2us延时 */
} SW_I2C_HOOKS;

typedef enum
{
    SW_I2C_OK = 0,		/* 操作成功 */
    SW_I2C_HOOKS_NULL,  /* 有接口函数尚未绑定 */
    SW_I2C_ACK,         /* 从机ACK应答 */
    SW_I2C_NCK,         /* 从机无ACK应答 */
} SW_I2C_RETURN;

/*************************************************************************
* 函数名称：SW_I2C_RETURN sw_i2c_regist_init(SW_I2C_HOOKS * i2c_hooks)
* 功能说明：注册软件I2C相关接口函数并初始化
* 输入参数：SW_I2C_HOOKS * i2c_hooks       --需提供的相关接口函数集合对象
* 输出参数：无
* 函数返回：操作成功：SW_I2C_OK
*          操作失败：见SW_I2C_RETURN枚举
* 其它说明：无
**************************************************************************/
SW_I2C_RETURN sw_i2c_regist_init(SW_I2C_HOOKS * i2c_hooks);

/*************************************************************************
* 函数名称：SW_I2C_RETURN sw_i2c_write_bytes(uint8 addr_7bit, uint8 * const tx_buf, uint16 tx_num)
* 功能说明：软件I2C写多个字节数据
* 输入参数：uint8 addr_7bit              --7bit从机地址         
*          uint8 * const tx_buf         --发送的数据区首地址
*          uint16 tx_num                --发送的数据长度
* 输出参数：无
* 函数返回：操作成功：SW_I2C_OK
*          操作失败：见SW_I2C_RETURN枚举
* 其它说明：无
**************************************************************************/
SW_I2C_RETURN sw_i2c_write_bytes(uint8 addr_7bit, uint8 * const tx_buf, uint16 tx_num);

/*************************************************************************
* 函数名称：SW_I2C_RETURN sw_i2c_read_bytes(uint8 addr_7bit, uint8 * rx_buf, uint16 rx_num)
* 功能说明：软件I2C读多个字节数据
* 输入参数：uint8 addr_7bit              --7bit从机地址         
*          uint16 tx_num                --读取的数据长度
* 输出参数：uint8 * rx_buf               --数据读取后存入的数据区首地址
* 函数返回：操作成功：SW_I2C_OK
*          操作失败：见SW_I2C_RETURN枚举
* 其它说明：无
**************************************************************************/
SW_I2C_RETURN sw_i2c_read_bytes(uint8 addr_7bit, uint8 * rx_buf, uint16 rx_num);

/*************************************************************************
* 函数名称：static void sw_i2c_delay(uint32 cnt)
* 功能说明：延时函数
* 输入参数：uint32 cnt      --延时计数
* 输出参数：无
* 函数返回：无
* 其它说明：无
**************************************************************************/
void sw_i2c_delay(uint32 cnt);


#ifdef __cplusplus
}
#endif

#endif
